﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIIV.Data;
using System.Text.RegularExpressions;

namespace SIIV.View.Desktop
{
    public partial class frmVeterinarios : frmBase
    {
        int idVeterinarioSeleccionado;
        int idAnimalSeleccionado;
        string contraseña;
        TabPage tab;

        public frmVeterinarios()
        {
            InitializeComponent();
        }

        private void frmUsuarios_Load(object sender, EventArgs e)
        {
            datosVeterinario.Text = "Datos Veterinario";
            datosVeterinario.Enabled = false;
            datosAnimal.Text = "Nuevo Animal";
            btnCancelar.Visible = false;
            btnCancelarAnimal.Visible = false;
            dtFechaNacimiento.Value = DateTime.Today;
            cargarVeterinarios();
            cargarTiposDeAnimales();
            dgvVeterinarios.ClearSelection();
            tab = tabControl1.TabPages[1];
            tabControl1.TabPages.RemoveAt(1);
            comboSexo.SelectedIndex = 0;
            comboBusquedaAnimalSexo.SelectedIndex = 0;
            comboBusquedaAnimalTipo.SelectedIndex = 0;
            dtFechaNacAni.Value = DateTime.Today;
        }

        private void cargarTiposDeAnimales()
        {
            foreach(TipoDeAnimal tipo in Animales.ObtenerTiposDeAnimales())
            {
                comboTipoDeAnimal.Items.Add(tipo);
                comboBusquedaAnimalTipo.Items.Add(tipo);
            }
            comboBusquedaAnimalTipo.Items.Insert(0, "[Todos]");
        }

        private void cargarVeterinarios()
        {
            dgvVeterinarios.Rows.Clear();
            List<Usuario> usuarios = Usuarios.ObtenerUsuarios(txtBusquedaUsuario.Text, 
                txtBusquedaNombreApellido.Text, 
                txtBusquedaEmail.Text, 
                txtBusquedaNroDocumento.Text.Equals(string.Empty) ? new Nullable<long>() : long.Parse(txtBusquedaNroDocumento.Text),
                Business.Roles.Veterinario);
            foreach (Usuario u in usuarios)
            {
                dgvVeterinarios.Rows.Add(u.Username, u.Email, u.Nombre, u.Apellido, u.NroDocumento, u.FechaNacimiento, u.IdUsuario, u.Password);
                dgvVeterinarios.Rows[dgvVeterinarios.Rows.Count - 1].ContextMenuStrip = ContextMenuStrip;
            }
            dgvVeterinarios.ClearSelection();
        }

        private void dgvVeterinarios_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            cargarDatosVeterinario(e);
            cargarAnimales();
            cbCria.Checked = false;
            cbCria_CheckedChanged(cbCria, null);
            btnCancelar.Visible = true;
            datosVeterinario.Enabled = true;
            if (tabControl1.TabPages.Count == 2)
            {
                tabControl1.TabPages.RemoveAt(1);                
            }
            tabControl1.TabPages.Add(tab);                       
        }

        private void cargarAnimales()
        {
            dgvAnimales.Rows.Clear();
            List<Animal> animales = Animales.ObtenerAnimales(
                idVeterinarioSeleccionado, 
                txtBusquedaAnimalNombre.Text, 
                txtBusquedaAnimalPesoInicial.Text.Equals(string.Empty) ? new Nullable<decimal>() : decimal.Parse(txtBusquedaAnimalPesoInicial.Text),
                txtBusquedaAnimalPesoFinal.Text.Equals(string.Empty) ? new Nullable<decimal>() : decimal.Parse(txtBusquedaAnimalPesoFinal.Text),
                comboBusquedaAnimalSexo.SelectedIndex.Equals(0) ? new Nullable<char>() : comboBusquedaAnimalSexo.SelectedItem.ToString()[0],
                comboBusquedaAnimalTipo.SelectedIndex.Equals(0) ? new Nullable<short>() : (short)comboBusquedaAnimalTipo.SelectedIndex);
                
            foreach (Animal a in animales)
            {
                dgvAnimales.Rows.Add(a.Nombre, a.Peso, a.Sexo, a.TipoDeAnimal.Nombre, a.EstadoDeAnimal.Nombre, a.FechaNacimiento, a.IdAnimalPadre.HasValue ? a.AnimalPadre.Nombre : "-", a.IdAnimal, a.IdAnimalPadre.HasValue ? a.IdAnimalPadre.Value : 0);
            }
            cbCria.Enabled = animales.Count > 1;
            comboTipoDeAnimal.SelectedIndex = 0;
        }

        private void cargarDatosVeterinario(DataGridViewCellMouseEventArgs e)
        {
            DataGridViewRow fila = dgvVeterinarios.Rows[e.RowIndex];
            datosVeterinario.Text = "Editar Veterinario: " + fila.Cells[3].Value.ToString() + ", " + fila.Cells[2].Value.ToString();
            txtApellido.Text = fila.Cells[3].Value.ToString();
            txtEmail.Text = fila.Cells[1].Value.ToString();
            txtNombre.Text = fila.Cells[2].Value.ToString();
            txtNroDocumento.Text = fila.Cells[4].Value.ToString();
            txtUsername.Text = fila.Cells[0].Value.ToString();
            dtFechaNacimiento.Value = DateTime.Parse(fila.Cells[5].Value.ToString());
            idVeterinarioSeleccionado = Convert.ToInt32(fila.Cells[6].Value);
            contraseña = fila.Cells[7].Value.ToString();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            errorProvider1.Clear();
            if (txtUsername.Text == string.Empty)
            {
                errorProvider1.SetError(txtUsername, "Debe ingresar el nombre del Usuario.");
            }
            else if (txtEmail.Text == string.Empty)
            {
                errorProvider1.SetError(txtEmail, "Debe ingresar una dirección de correo.");
            }
            else if (!ValidaEmail(txtEmail.Text))
            {
                errorProvider1.SetError(txtEmail, "E-mail incorrecto.");
            }
            else if (txtNombre.Text == string.Empty)
            {
                errorProvider1.SetError(txtNombre, "Debe ingresar el nombre.");
            }
            else if (ValidarNumero(txtNombre.Text))
            {
                errorProvider1.SetError(txtNombre, "Ingreso incorrectos, debe ingresar letras.");
            }
            else if (txtApellido.Text == string.Empty)
            {
                errorProvider1.SetError(txtApellido, "Debe ingresar el apellido.");
            }
            else if (ValidarNumero(txtApellido.Text))
            {
                errorProvider1.SetError(txtApellido, "Ingreso incorrectos, debe ingresar letras.");
            }

            else if (txtNroDocumento.Text == string.Empty)
            {
                errorProvider1.SetError(txtNroDocumento, "Debe ingresar el nro de documento.");
            }
            else if (!ValidarNroDocumeneto(txtNroDocumento.Text))
            {
                errorProvider1.SetError(txtNroDocumento, "Debe ingresar un documento válido.");
            }
            else
            {
                try
                {
                    if (MessageBox.Show("¿Desea Guadar los cambios " + "?", "Confirmación Datos", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    {
                        Usuarios.ActualizarUsuario(idVeterinarioSeleccionado, txtApellido.Text, contraseña, txtEmail.Text, txtNombre.Text, long.Parse(txtNroDocumento.Text), txtUsername.Text, dtFechaNacimiento.Value, SIIV.Business.Roles.Veterinario);
                        cargarVeterinarios();
                        reiniciarFormularioVeterinario();
                    }
                }
                catch (Exception ex)
                {
                    MostrarError(ex.Message);
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            reiniciarFormularioVeterinario();
        }

        private void reiniciarFormularioVeterinario()
        {
            txtApellido.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtNombre.Text = string.Empty;
            txtNroDocumento.Text = string.Empty;
            txtUsername.Text = string.Empty;
            dtFechaNacimiento.Value = dtFechaNacimiento.MinDate;
            datosVeterinario.Text = "Datos Veterinario";
            btnCancelar.Visible = false;
            idVeterinarioSeleccionado = 0;
            dgvVeterinarios.ClearSelection();
            datosVeterinario.Enabled = false;
            tabControl1.TabPages.RemoveAt(1);
        }

        private void reiniciarFormularioAnimal()
        {
            txtNombreAnimal.Text = string.Empty;
            txtPeso.Text = string.Empty;
            dtFechaNacimiento.Value = dtFechaNacimiento.MinDate;
            if (comboAnimalPadre.Items.Count >= 1)
            {
                comboAnimalPadre.DataSource = null;
                comboAnimalPadre.Items.Clear();
            }            
            comboAnimalPadre.Items.Add("[NINGUNO]");
            comboAnimalPadre.SelectedIndex = 0;
            comboSexo.SelectedIndex = 0;
            datosAnimal.Text = "Nuevo Animal";
            btnCancelarAnimal.Visible = false;
            dgvAnimales.ClearSelection();
            comboSexo.SelectedIndex = 0;
            idAnimalSeleccionado = 0;
            cbCria.Checked = false;
            dtFechaNacAni.Value = DateTime.Today;
        }

        private void btnGuardarAnimal_Click(object sender, EventArgs e)
        {
            errorProvider1.Clear();
            if (txtNombreAnimal.Text == string.Empty)
            {
                errorProvider1.SetError(txtNombreAnimal, "Debe ingresar un nombre de animal.");
            }

            else if (txtPeso.Text == string.Empty)
            {
                errorProvider1.SetError(txtPeso, "Debe ingresar un peso válido.");
            }
            
            else
            {
                try
                {
                    if (MessageBox.Show("¿Desea Guadar los cambios " + "?", "Confirmación Datos", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    {
                        if (idAnimalSeleccionado.Equals(0))
                        {
                            Animales.CrearAnimal(txtNombreAnimal.Text, decimal.Parse(txtPeso.Text), cbCria.Checked ? Convert.ToInt32(comboAnimalPadre.SelectedValue) : new Nullable<int>(), comboSexo.SelectedItem.ToString()[0], ((TipoDeAnimal)comboTipoDeAnimal.SelectedItem).IdTipoDeAnimal, dtFechaNacAni.Value, idVeterinarioSeleccionado);
                        }
                        else
                        {
                            Animales.ActualizarAnimal(idAnimalSeleccionado, txtNombreAnimal.Text, decimal.Parse(txtPeso.Text), cbCria.Checked ? Convert.ToInt32(comboAnimalPadre.SelectedValue) : new Nullable<int>(), comboSexo.SelectedItem.ToString()[0], ((TipoDeAnimal)comboTipoDeAnimal.SelectedItem).IdTipoDeAnimal, dtFechaNacAni.Value);
                        }
                        cargarAnimales();
                        reiniciarFormularioAnimal();
                    }
                }
                catch (Exception ex)
                {
                    MostrarError(ex.Message);
                }
            }
        }

        private void btnCancelarAnimal_Click(object sender, EventArgs e)
        {
            reiniciarFormularioAnimal();
        }

        private void dgvAnimales_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (!e.RowIndex.Equals(-1))
            {
                DataGridViewRow fila = dgvAnimales.Rows[e.RowIndex];
                datosAnimal.Text = "Editar Animal: " + fila.Cells[0].Value.ToString();
                txtNombreAnimal.Text = fila.Cells[0].Value.ToString();
                txtPeso.Text = fila.Cells[1].Value.ToString();
                if (fila.Cells[6].Value.ToString().Length > 2)
                {
                    comboAnimalPadre.Enabled = true;
                    cbCria.Checked = true;
                }
                else
                {
                    comboAnimalPadre.Enabled = false;
                    cbCria.Checked = false;
                }
                if (comboAnimalPadre.Enabled)
                {
                    comboAnimalPadre.DisplayMember = "Nombre";
                    comboAnimalPadre.ValueMember = "IdAnimal";
                    comboAnimalPadre.DataSource = Animales.ObtenerAnimalesSinSerElMismo(idVeterinarioSeleccionado, txtNombreAnimal.Text.ToString(), new Nullable<decimal>(), new Nullable<decimal>(), new Nullable<char>(), new Nullable<short>());
                    comboAnimalPadre.SelectedValue = Convert.ToInt32(fila.Cells[8].Value);
                }
                else
                {
                    comboAnimalPadre.DataSource = null;
                    comboAnimalPadre.Items.Add("[NINGUNO]");
                    comboAnimalPadre.SelectedIndex = 0;
                }
                if (fila.Cells[2].Value.ToString() == "M")
                {
                    comboSexo.SelectedIndex = 0;
                }
                else
                {
                    comboSexo.SelectedIndex = 1;
                }

                comboTipoDeAnimal.SelectedIndex = comboTipoDeAnimal.FindString(fila.Cells[3].Value.ToString());
                dtFechaNacAni.Value = DateTime.Parse(fila.Cells[5].Value.ToString());
                idAnimalSeleccionado = Convert.ToInt32(fila.Cells[7].Value);
                btnCancelarAnimal.Visible = true;
            }
        }

        private void cbCria_CheckedChanged(object sender, EventArgs e)
        {
            comboAnimalPadre.Enabled = cbCria.Checked;
            if (comboAnimalPadre.Enabled)
            {
                comboAnimalPadre.DisplayMember = "Nombre";
                comboAnimalPadre.ValueMember = "IdAnimal";
                comboAnimalPadre.DataSource = Animales.ObtenerAnimalesSinSerElMismo(idVeterinarioSeleccionado, txtNombreAnimal.Text.ToString(), new Nullable<decimal>(), new Nullable<decimal>(), new Nullable<char>(), new Nullable<short>());
            }
            else
            {
                comboAnimalPadre.DataSource = null;
                comboAnimalPadre.Items.Add("[NINGUNO]");
                comboAnimalPadre.SelectedIndex = 0;
            }
        }

        private void btnBuscarAnimal_Click(object sender, EventArgs e)
        {
            cargarAnimales();
        }

        private void dgvVeterinarios_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (!e.RowIndex.Equals(-1))
            {
                dgvVeterinarios.Rows[e.RowIndex].Selected = true;
            }
        }

        private void dgvAnimales_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (!e.RowIndex.Equals(-1))
            {
                dgvAnimales.Rows[e.RowIndex].Selected = true;
            }
        }


        /****************Validaciones de ingresos INICIO*************************/
        /************************************************************************/

        private bool ValidarNumero(string strNumero)
        {
            int intNumero = 0;

            if (int.TryParse(strNumero, out intNumero))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private bool ValidarNroDocumeneto(string strNumero)
        {
            int intNumero = 0;
            if (int.TryParse(strNumero, out intNumero))
            {
                if (intNumero > 1000000)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        
        private Boolean ValidaEmail(String email)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

         private void btnBuscar_Click(object sender, EventArgs e)
        {
            if (txtBusquedaEmail.Text.Length > 0)
            {
                if (ValidaEmail(txtBusquedaEmail.Text) == false)
                {
                    MostrarError("Formato de Email Inválido");
                    txtBusquedaEmail.Text = null;
                }
                
            }
                 cargarVeterinarios();
                  
        }

        private void dgvVeterinarios_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void txtBusquedaNroDocumento_KeyPress_1(object sender, KeyPressEventArgs e)
        {
            //Permitimos solo números y  el símbolo .
            if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != 8)
                e.Handled = true; 
        }

        private void txtNroDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Permitimos solo números y  el símbolo .
            if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != 8)
                e.Handled = true; 
        }

                
          public bool ValidarDecimal(string texto, int coma)
          {
              if (coma == 1)
              {
                  string pattern = "^([0-9]{1,4}[,]{0,1}[0-9]{0,3})$";
                  return System.Text.RegularExpressions.Regex.IsMatch(texto, pattern);
              }
              else
              {
                  string pattern = "^([0-9]{1,4})$";
                  return System.Text.RegularExpressions.Regex.IsMatch(texto, pattern);
              }
          }

          private void txtPeso_TextChanged(object sender, EventArgs e)
          {
              if (txtPeso.Text.Length > 0)
              {
                  if (txtPeso.Text.Contains(","))
                  {
                      if (ValidarDecimal(txtPeso.Text, 1) == false)
                      {
                          MostrarError("Formato de peso inválido: \"" + txtPeso.Text + "\", ingrese otro con el siguiente formato XXXX,XXX");
                          txtPeso.Text = null;
                      }
                  }
                  else
                  {
                      if (ValidarDecimal(txtPeso.Text, 0) == false)
                      {
                          MostrarError("Formato de peso inválido: \"" + txtPeso.Text + "\", ingrese otro con el siguiente formato XXXX,XXX");
                          txtPeso.Text = null;
                      }
                  }
              }
          }

          private void txtBusquedaAnimalPesoInicial_TextChanged(object sender, EventArgs e)
          {
              if (txtBusquedaAnimalPesoInicial.Text.Length > 0)
              {
                  if (txtBusquedaAnimalPesoInicial.Text.Contains(","))
                  {
                      if (ValidarDecimal(txtBusquedaAnimalPesoInicial.Text, 1) == false)
                      {
                          MostrarError("Formato de peso inválido: \"" + txtBusquedaAnimalPesoInicial.Text + "\", ingrese otro con el siguiente formato XXXX,XXX");
                          txtBusquedaAnimalPesoInicial.Text = null;
                      }
                  }
                  else
                  {
                      if (ValidarDecimal(txtBusquedaAnimalPesoInicial.Text, 0) == false)
                      {
                          MostrarError("Formato de peso inválido: \"" + txtBusquedaAnimalPesoInicial.Text + "\", ingrese otro con el siguiente formato XXXX,XXX");
                          txtBusquedaAnimalPesoInicial.Text = null;
                      }
                  }
              }
          }

          private void txtBusquedaAnimalPesoFinal_TextChanged(object sender, EventArgs e)
          {
              if (txtBusquedaAnimalPesoFinal.Text.Length > 0)
              {
                  if (txtBusquedaAnimalPesoFinal.Text.Contains(","))
                  {
                      if (ValidarDecimal(txtBusquedaAnimalPesoFinal.Text, 1) == false)
                      {
                          MostrarError("Formato de peso inválido: \"" + txtBusquedaAnimalPesoFinal.Text + "\", ingrese otro con el siguiente formato XXXX,XXX");
                          txtBusquedaAnimalPesoFinal.Text = null;
                      }
                  }
                  else
                  {
                      if (ValidarDecimal(txtBusquedaAnimalPesoFinal.Text, 0) == false)
                      {
                          MostrarError("Formato de peso inválido: \"" + txtBusquedaAnimalPesoFinal.Text + "\", ingrese otro con el siguiente formato XXXX,XXX");
                          txtBusquedaAnimalPesoFinal.Text = null;
                      }
                  }
              }
          }
                                         
        /**********************Validaciones de Ingresos FIN**********************/
        /************************************************************************/

    }
}
